#include <iostream>
#include <memory>
#include <random>
#include <algorithm>
#include <stdlib.h>

void custom_memcpy(char *dst, char *src, int size)
{
    if (dst > src)
    {
        for (int idx = size - 1; idx >= 0; --idx)
        {
            dst[idx] = src[idx];
        }
    }
    else
    {
        int idx = 0;
        for (int idx = 0; idx < size; ++idx)
        {
            dst[idx] = src[idx];
        }
    }
}

void dump_vector(std::vector<int> &vec)
{
    for (auto n : vec)
    {
        std::cout << n << ",";
    }
    std::cout << std::endl;
}

int main()
{
    std::random_device rd;
    std::mt19937 rd_gen(rd());
    std::vector<int> vec;
    int cnt = 6 * 2;
    vec.resize(cnt);
    std::generate(vec.begin(), vec.end(), [&rd_gen]() -> int
                  { return rd_gen() % 10; });
    std::vector<int> vec_result(vec);
    dump_vector(vec);

    int copied_cnt = cnt / 2;
    // memcpy(vec.data(), vec.data() + copied_cnt / 2, copied_cnt);
    // memcpy(vec.data() + copied_cnt / 2, vec.data(), copied_cnt);

    memmove((char *)vec.data(), (char *)vec.data() + copied_cnt / 2, copied_cnt);
    memmove((char *)vec.data() + copied_cnt / 2, (char *)vec.data(), copied_cnt);
    custom_memcpy((char *)vec_result.data(), (char *)vec_result.data() + copied_cnt / 2, copied_cnt);
    custom_memcpy((char *)vec_result.data() + copied_cnt / 2, (char *)vec_result.data(), copied_cnt);

    dump_vector(vec);
    dump_vector(vec_result);
    bool result = std::equal(vec.begin(), vec.end(), vec_result.begin(), vec_result.end());
    std::cout << result << std::endl;

    return 0;
}